{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "OpenGL API 特性\n",
    "-------------------------\n",
    "\n",
    "1. 数据类型\n",
    "2. OpenGL 错误标志\n",
    "3. 确认OpenGL版本\n",
    "4. glHint 指定偏视觉质量还是偏性能\n",
    "5. OpenGL 状态机\n",
    "\n",
    "### 概念\n",
    "1. 图元 primivtive\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "基础的渲染方式\n",
    "----------------------\n",
    "\n",
    "### 着色器\n",
    "1. 各种类型的着色器\n",
    "2. 着色器可以有各种属性\n",
    "\n",
    "### 视角\n",
    "\n",
    "### 光照\n",
    "\n",
    "### 几何图形\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    " 变换的相关基础\n",
    "-------------------------------\n",
    "- ** 视觉坐标 ** : 感觉是跟观察者坐标类似的一个概念。\n",
    "- ** 视图变换 ** : 整个场景进行变换\n",
    "- ** 模型变换 ** : 场景中得某个模型进行一定的变换。 _(先平移，后旋转。)_\n",
    "\n",
    "> 将对象向后移动和将参考坐标向前移动在视觉上是相同的。将两者分开纯粹为了编码方便。\n",
    "\n",
    "- ** 模型视图 ** : 是指将上面两种变换进行组合，成为一个单独的矩阵，成为模型视图矩阵。\n",
    "- ** 投影变换 ** : 在场景和模型的各种变换都完成之后\n",
    "- ** 视口变换 ** : 貌似不需要怎么管理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "模式视图矩阵\n",
    "----------------------\n",
    "> 模式视图矩阵是一个4x4矩阵，他表示一个变换后的坐标系\n",
    "![模式视图矩阵](img/moshishitujuzhen.png)\n",
    "\n",
    "> 空间中任何位置和方向都可以由一个4x4矩阵唯一确定。\n",
    "\n",
    "> 要把两种变换结合起来，可以让两个矩阵相乘。（顺序是有关系的）\n",
    "\n",
    "> 欧拉角与四元数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "矩阵旋转\n",
    "------------------\n",
    "** 优点 **\n",
    "\n",
    "1. 旋转轴可以是任意向量；\n",
    "\n",
    "\n",
    "** 缺点 **\n",
    "\n",
    "1. 旋转其实只需要知道一个向量+一个角度，一共4个值的信息，但矩阵法却使用了16个元素；\n",
    "2. 而且在做乘法操作时也会增加计算量，造成了空间和时间上的一些浪费；\n",
    "\n",
    "欧拉旋转\n",
    "------------------\n",
    "\n",
    "** 优点 **\n",
    "\n",
    "1. 很容易理解，形象直观；\n",
    "2. 表示更方便，只需要3个值（分别对应x、y、z轴的旋转角度）；但按我的理解，它还是转换到了3个3*3的矩阵做变换，效率不如四元数；\n",
    "\n",
    "** 缺点 **\n",
    "\n",
    "1. 之前提到过这种方法是要按照一个固定的坐标轴的顺序旋转的，因此不同的顺序会造成不同的结果；\n",
    "2. 会造成万向节锁（Gimbal Lock）的现象。这种现象的发生就是由于上述固定坐标轴旋转顺序造成的。理论上，欧拉旋转可以靠这种顺序让一个物体指到任何一个想要的方向，但如果在旋转中不幸让某些坐标轴重合了就会发生万向节锁，这时就会丢失一个方向上的旋转能力，也就是说在这种状态下我们无论怎么旋转（当然还是要原先的顺序）都不可能得到某些想要的旋转效果，除非我们打破原先的旋转顺序或者同时旋转3个坐标轴。这里有个视频可以直观的理解下；\n",
    "由于万向节锁的存在，欧拉旋转无法实现球面平滑插值；\n",
    "\n",
    "四元数旋转\n",
    "-------------------\n",
    "** 优点 **\n",
    "\n",
    "1. 可以避免万向节锁现象；\n",
    "2. 只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转，方便快捷；\n",
    "3. 可以提供平滑插值；\n",
    "\n",
    "** 缺点 **\n",
    "\n",
    "1. 比欧拉旋转稍微复杂了一点点，因为多了一个维度，但速度更快速；\n",
    "2. 理解更困难，不直观；"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
